//
//  main.c
//  队列
//
//  Created by 仲7 on 2025/2/18.
//

#include"queue.h"
//队列初始化
void QueueInit(queue* pq)
{
    assert(pq);
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}
//入队列
void QueuePush(queue* pq,QDataType x)
{
    assert(pq);
    //申请新节点
    qd* Newnode = (qd*)malloc(sizeof(qd));
    //新节点初始化
    Newnode->next = NULL;
    Newnode->data = x;
    //连接尾节点,两种情况
    //队列·为空
    if(pq->phead == NULL)
    {
        pq->phead = pq->ptail = Newnode;
    }
    else//队列不为空，直接插入
    {
        pq->ptail->next = Newnode;
        pq->ptail = Newnode;
    }
    ++pq->size;
}
//判断队列是否为空
bool QueueEmpty(queue* pq)
{
    assert(pq);
    return pq->phead == NULL && pq->ptail == NULL;
}
//出队列
void QueuePop(queue* pq)
{
    assert(pq);
    //队列不能为空
    assert(!QueueEmpty(pq));
    //队列只有一个节点时
    if(pq->phead == pq->ptail)
    {
        free(pq->phead);//释放 phead 和 ptail 其中任意一个即可
        pq->phead = pq->ptail = NULL;
    }
    else//多于一个节点
    {
        qd* pcur = pq->phead;
        pq->phead = pq->phead->next;
        free(pcur);
        pcur = NULL;
    }
    --pq->size;
}
//返回有效数据个数
int QueueSize(queue* pq)
{
    assert(pq);
    return pq->size;
}
//取队头数据
QDataType QueueFront(queue* pq)
{
    //参数不为空，队列不为空
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->phead->data;
}
//取队尾数据
QDataType QueueBack(queue* pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->ptail->data;
}
//销毁链表
void QueueDestroy(queue* pq)
{
    //传参不为空，队列不为空
    assert(pq);
    assert(!QueueEmpty(pq));
    //挨个销毁，就跟销毁链表几乎一样
    qd* pcur = pq->phead;
    while (pcur) {
        qd* Next = pcur->next;//保存下一个节点
        free(pcur);//释放本节点
        pcur = Next;
    }//pcur已在 while 里面循环为空了
    //所有的节点均被释放，还剩两个指针等待置空
    pq->phead = pq->ptail = NULL;
    pq->size = 0;
}
